<?php
/**
 * Created by PhpStorm.
 * User: zhangbing
 * Date: 2017/5/20
 * Time: 16:16
 */
namespace app\models;
use think\Model;
use think\Db;

/**
 *
 * Class Data
 * @package app\models
 */
class Models extends Model{
    protected $tableName = '';

    // 状态
    const STATUS_OFF         = 0;   // 禁用
    const STATUS_ON          = 1;   // 启用
    const STATUS_NOT_ACTIVE  = 2;   // 未激活
    const STATUS_OVER        = 2;   // 已结束活动
    const STATUS_DELETE      = 2;   // 已删除
    const STATUS_READY       = 3;   // 已筹备活动
    const STATUS_CANCEL      = 4;   // 已取消

    // 删除状态
    const DELETE_NOT = 0;   // 未删除
    const DELETE_YES = 1;   // 已删除

    // 订单状态
    const ORDER_PAY_NOT = 0;   // 未支付
    const ORDER_PAY_YES = 1;   // 已支付
    const ORDER_CANCEL  = 2;   // 已取消

    // 用户类型
    const USER_TYPE_NORMAL = 1;   // 普通用户
    const USER_TYPE_ACTOR  = 2;   // 艺人
    const USER_TYPE_SELLER = 3;   // 营销

    // 角色
    const GROUP_ADMIN    = 1;   // 超级管理员
    const GROUP_BUSINESS = 2;   // 商家

    // 官方
    const OFFICIAL = 1;

    // 提现审核
    const AUDIT_NOT    = 0;    // 未审核
    const AUDIT_PASS   = 1;    // 已审核
    const AUDIT_NOPASS = 2;    // 已拒绝
    const AUDIT_CANCEL = 3;    // 已取消

    // 发行代金券
    const VOUCHER_ISSUE_NOT = 0;    // 未发行
    const VOUCHER_ISSUE_YES = 1;    // 已发行
    const VOUCHER_OVER      = 2;    // 已失效

    const VOUCHER_USE_YES   = 1;    // 已使用
    const VOUCHER_USE_NOT   = 0;    // 未使用

    // 关注
    const FOLLOW_NOT = 0;   // 未关注
    const FOLLOW_YES = 1;   // 已关注

    // 关注类型
    const FOLLOW_BUSINESS = 2;   // 关注商家
    const FOLLOW_USER     = 1;   // 关注用户
    const FOLLOW_ACTOR    = 3;   // 关注艺人

    // 商品审核
    const GOODS_AUDIT_NOT    = 0;  // 未审核
    const GOODS_AUDIT_NOPASS = 1;  // 未通过
    const GOODS_STATUS_OFF   = 2;  // 已禁用
    const GOODS_STATUS_ON    = 3;  // 已启用
    const GOODS_SALES_ALL    = 4;  // 已售完

    // 活动类型
    const ACTIVITY_TYPE_OFFICIAL = 1;   // 官方活动
    const ACTIVITY_TYPE_BUSINESS = 2;   // 商家活动
    const ACTIVITY_TYPE_USER     = 3;   // 用户活动
    const ACTIVITY_TYPE_PWD      = 4;   // 用户暗号活动

    // 位置类型
    const LOCATION_USER     = 0;  // 用户
    const LOCATION_BUSINESS = 1;  // 商家

    // 是否参加活动
    const JOIN_NOT = 0;   // 未参与活动
    const JOIN_YES = 1;   // 参与活动

    // 活动是否结束
    const ACTIVITY_NOT_OVER = 0;    // 未结束
    const ACTIVITY_OVER     = 1;    // 结束

    // 扫码进入
    const SCAN_YES = 1;   // 扫码有效
    const SCAN_NOT = 0;   // 扫码失效

    // 订单类型
    const ORDER_TYPE_WINE     = 1;  // 酒水
    const ORDER_TYPE_EVENT    = 2;  // 活动
    const ORDER_TYPE_RECHARGE = 3;  // 充值

    // 预定桌子
    const TABLE_NOT = 0;  // 未预定
    const TABLE_YES = 1;  // 已预定

    // 费用方式
    const MONEY_ALL = 1;    // 请客
    const MONEY_AA  = 2;    // AA

    // 支付方式
    const PAY_ALIPAY = 1;   // 支付宝
    const PAY_WECHAT = 2;   // 微信

    // 商品类型
    const GOODS_TYPE_COMBO = 1;   // 套餐
    const GOODS_TYPE_GOODS = 2;   // 单品

    // 活动订单发起人
    const IS_ORIGINATOR = 1;   // 发起人
    const NOT_ORIGINATOR = 0;   // 不是发起人

    public function __construct($tableName = ''){
        $this->tableName = $tableName;
    }

    /**
     * 添加一条记录，并返回该记录id
     * @param array $data
     * @return int|string
     */
    public function _add($data){
        return Db::name($this->tableName)->insertGetId($data);
    }

    /**
     * 删除记录，返回受影响行数
     * @param array $where 主键直接传值
     * @return int
     */
    public function _delete($where){
        return is_array($where) ? Db::name($this->tableName)->where($where)->delete() : Db::name($this->tableName)->delete($where);
    }

    /**
     * 更新记录，返回受影响行数
     * @param array|mixed|string $data
     * @param array $where
     * @return int|string
     */
    public function _save($data,$where = []){
        return empty($where) ? Db::name($this->tableName)->update($data) : Db::name($this->tableName)->where($where)->update($data) ;
    }

    /**
     * 返回一条记录
     * @param array|\Closure|mixed|null|string|\think\db\Query $where
     * @param string $field
     * @return array|false|mixed|\PDOStatement|string|Model
     */
    public function _find($where,$field = '*'){
        return is_array($where) ? Db::name($this->tableName)->field($field)->where($where)->find() : Db::name($this->tableName)->field($field)->find($where);
    }

    /**
     * 返回多条记录
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @param string $group
     * @return false|mixed|\PDOStatement|string|\think\Collection
     */
    public function _select($where = [],$field = '*',$order = '',$limit = '',$group = ''){
        return Db::name($this->tableName)->field($field)->where($where)->group($group)->order($order)->limit($limit)->select();
    }

    /**
     * 分页返回多条记录
     * @param array $where
     * @param string $filed
     * @param string $order
     * @param array $join
     * @param int $currentPage
     * @param int $page
     * @param array $query
     * @return \think\Paginator
     */
    public function _page($where = [],$filed = '*',$order = '',$join = [],$currentPage = 1,$page = 20,$query = []){
        return Db::name($this->tableName)->alias('a')->field($filed)->join($join)->where($where)->order($order)->paginate($page,false,['query'=>$query,'var_page'=>'page','page'=>$currentPage]);
    }

    /**
     * 返回某个字段的值
     * @param string $where
     * @param mixed|null $field
     * @return mixed
     */
    public function getValue($where,$field){
        return Db::name($this->tableName)->where($where)->value($field);
    }

    /**
     * 更新某个字段的值
     * @param array|string $where
     * @param mixed|string $data
     * @return int
     */
    public function setValue($where,$data){
        return Db::name($this->tableName)->where($where)->setField($data);
    }

    /**
     * 返回某一列数据
     * @param $where
     * @param $field
     * @param string $order
     * @return array
     */
    public function getColumn($where,$field,$order = ''){
        return Db::name($this->tableName)->where($where)->order($order)->column($field);
    }

    /**
     * 连表查询单条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @return array|false|\PDOStatement|string|Model
     */
    public function joinOne($join,$where = [],$field = '*'){
        return Db::name($this->tableName)->alias('a')->field($field)->join($join)->where($where)->find();
    }

    /**
     * 连表查询多条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @param string $group
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function joinMany($join,$where = [],$field = '*',$order = '',$limit = '',$group = ''){
        return Db::name($this->tableName)->alias('a')->distinct(true)->field($field)->join($join)->where($where)->group($group)->order($order)->limit($limit)->select();
    }

    /**
     * 连表查询多条信息中的一列数据
     * @param $join
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function joinManyColumn($join,$where = [],$field = '*',$order = '',$limit = ''){
        return Db::name($this->tableName)->alias('a')->distinct(true)->join($join)->where($where)->order($order)->limit($limit)->column($field);
    }

    /**
     * 自增一个字段的值
     * @param array $where
     * @param string $field
     * @param int $value
     * @return int|true
     */
    public function _setInc($where,$field,$value = 1){
        return Db::name($this->tableName)->where($where)->setInc($field,$value);
    }

    /**
     * 自减一个字段的值
     * @param $where
     * @param $field
     * @param int $value
     * @return int|true
     */
    public function _setDec($where,$field,$value = 1){
        return Db::name($this->tableName)->where($where)->setDec($field,$value);
    }

    /**
     * 批量插入
     * @param array $data 二维数组
     * @return int|string
     */
    public function _addAll($data = []){
        return Db::name($this->tableName)->insertAll($data);
    }

    /**
     * 聚合函数
     * @param array $where
     * @return int|string
     */
    public function count($where = []){
        return Db::name($this->tableName)->where($where)->count();
    }

    /**
     * 聚合函数
     * @param array $where
     * @param $data
     * @return float|int
     */
    public function sum($data,$where = []){
        return Db::name($this->tableName)->where($where)->sum($data);
    }

    /**
     * 聚合函数
     * @param string $where
     * @param $field
     * @return mixed
     */
    public function max($where,$field){
        return Db::name($this->tableName)->where($where)->max($field);
    }
}